iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0

as of query graph

先來解說圖:

  • 綠色的圓圈部分:代表「改變資料庫狀態的事件」,是一個又一個資料原子 (Datom)。資料原子是用 E/A/V/T/op 的形式記著真實世界的資訊。
  • 紫色的九格部分:代表在 t1 對應的資料庫,也就是 t1 時間之前的所有資料原子聚合起來所對應的資料庫。

時間 t1 對應了 2024-01-01 的時間,而現在已經是 t3 時間了。當我們處於 t3 時間,有辦法透過查詢資料庫來取得 t1 時間對應的資料庫的狀態嗎?這種需求在 RDBMS 的話,頗麻煩;在以事件溯源為基礎而設計的 Datomic 的話,透過 d/as-of 這個 API 就可以達成。

程式碼與資料範例

  • 綠色的圓圈部分
e a v tx added
0x00000c00000003e9 :db/txInstant Mon Dec 31 19:00:00 0xc00000003e9 true
0x00001000000003ea :item/id DLC-042 0xc00000003e9 true
0x00001000000003ea :item/description Dilitihium Crystals 0xc00000003e9 true
0x00001000000003ea :item/count 100 0xc00000003e9 true
0x00000c00000003eb :db/txInstant Thu Jan 31 19:00:00 0xc00000003eb true
0x00001000000003ea :item/count 100 0xc00000003eb false
0x00001000000003ea :item/count 250 0xc00000003eb true
0x00000c00000003ec :db/txInstant Thu Feb 27 19:00:00 0xc00000003ec true
0x00001000000003ea :item/count 250 0xc00000003ec false
0x00001000000003ea :item/count 50 0xc00000003ec true
0x00000c00000003ed :db/txInstant Mon Mar 31 20:00:00 0xc00000003ed true
0x00000c00000003ed :tx/error true 0xc00000003ed true
0x00001000000003ea :item/count 50 0xc00000003ed false
0x00001000000003ea :item/count 9999 0xc00000003ed true
0x00000c00000003ee :db/txInstant Wed May 14 20:00:00 0xc00000003ee true
0x00001000000003ea :item/count 9999 0xc00000003ee false
0x00001000000003ea :item/count 100 0xc00000003ee true
  • 當下時間 t3 的查詢
(def db (d/db conn))
(d/pull db '[*] [:item/id "DLC-042"])
=> {:db/id 55301036830621764, 
     :item/id "DLC-042", 
     :item/description "Dilitihium Crystals", 
     :item/count 100}
  • 回到過去時間 t1 之後,做一模一樣的查詢
;; 注意:db 是 t3 時間對應的資料庫。
;; (d/as-of db t1) 會傳回 t1 時間對應的資料庫


(def as-of-eoy-2013 (d/as-of db #inst "2014-01-01"))
(d/pull as-of-eoy-2013 '[*] [:item/id "DLC-042"])
=> {:db/id 55301036830621764, 
      :item/id "DLC-042", 
      :item/description "Dilitihium Crystals", 
      :item/count 250}

資料庫過濾器 (Database filter)

這邊我們要做個詞彙歧義的解說:關於「資料庫」一詞的兩個含義。

  1. 第一個含義是平常我們常用的語義,比方說,我們講 RDBMS 資料庫、Datomic 資料庫。它可能指一個抽象的概念或是一個軟體,總之,它儲存了所有的資料。
  2. 第二個含義則是在 Datomic 世界觀裡的語義,它是指資料原子 (datom) 聚合後的結果。在 Datomic ,資料是以資料原子的形式存在。整個 Datomic 內含的所有資料是一連串的資料原子。然而,資料原子無法直接做查詢,必須先做聚合,變成『資料庫』之後,才能做查詢。

當我們談「資料庫過濾器」時,此處的資料庫是第二個含義的資料庫。而 Datomic 總共提供了三個內建的資料庫過濾器:

  • as-of : 篩選某個特定時間之前的所有資料原子。
  • since:篩選某個特定時間之後的所有資料原子。
  • history:讓資料庫包含未經聚合處理資料原子,特別是包含了 addedfalse 的資料原子。這讓我們可以看到對某一個資料實體的所有修改。

參考資料

其它資源

  1. 歡迎訂閱 PruningSuccess 電子報,主要談論軟體開發、資料處理、資料分析等議題。
  2. 歡迎加入 Clojure 社群

上一篇
阻抗不匹配與 Datomic 的解決方案
下一篇
欄位綱要 (column schema)
系列文
Datomic,內建事件溯源的資料庫。26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言